package com.amos.exception;

import org.springframework.util.StringUtils;

import java.util.Collection;

/**
 * Copyright © 2018 嘉源锐信. All rights reserved.
 *
 * @Project: mu-exam
 * @ClassName: BizAssert
 * @Package: com.amos.exception
 * @author: zhuqb
 * @Description: 自定义的断言
 * 仿照Assert的思路来提供异常的处理，让代码更优美
 * 接口定义创建异常的定义方法，并且默认提供异常的判断方法
 * @date: 2020/3/24 0024 下午 15:37
 * @Version: V1.0
 */
public interface BizAssert {

    /**
     * 定义创建异常的方法
     *
     * @param args 异常的信息
     * @return
     */
    BaseException newException(Object... args);

    /**
     * 定义创建好友异常信息的异常的方法
     *
     * @param throwable 异常的信息
     * @param args      异常的msg
     * @return
     */
    BaseException newException(Throwable throwable, Object... args);

    /**
     * 直接抛出异常
     *
     * @param msg
     */
    default void throwException(String msg) {
        throw this.newException(msg);
    }

    /**
     * 判断对象是否是空
     *
     * @param object 带判断是否为空的对象
     */
    default void notNullAssert(Object object) {
        if (StringUtils.isEmpty(object)) {
            throw this.newException(object);
        }
    }

    /**
     * 判断对象是否为空
     *
     * @param object 带判断是否为空的对象
     * @param msg    异常返回的信息
     */
    default void notNullAssert(Object object, String msg) {
        if (StringUtils.isEmpty(object)) {
            throw this.newException(msg);
        }
    }

    /**
     * 判断对象是否为空（集合没有元素）
     *
     * @param object 带判断是否为空的对象
     * @param msg    异常返回的信息
     */
    default void notEmptyAssert(Object object, String msg) {
        if (StringUtils.isEmpty(object)) {
            throw this.newException(msg);
        }
        // 如果是集合，则判断集合里面的元素是否存在
        if (object instanceof Collection) {
            int size = ((Collection) object).size();
            if (size == 0) {
                throw this.newException(msg);
            }
        }

        // 如果是数组，则判断数组元素是否存在
        if (object.getClass().isArray()) {
            int length = ((Object[]) object).length;
            if (length == 0) {
                throw this.newException(msg);
            }
        }
    }
}
